package com.lml.jdk8.localdate.java8Time;

import org.junit.jupiter.api.Test;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

/**
 * @author luomingliang
 * @date 2021/9/12 18:28
 */
public class Java8TimeTemporalAdjusterDemo {

    /**
     * 学习with(TemporalAdjuster temporalAdjuster)的使用
     */
    @Test
    public void test01() {
        //封装日期时间对象为当前时间。
        LocalDate now = LocalDate.now();

        //通过with方法传入TemporalAdjuster类的实现类对象，就可以进行修改，
        //实现类对象时由TemporalAdjuster类的静态方法来提供的。修改时间为当月的第一天
        LocalDate firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth());
        System.out.println("将时间修改为当月的第一天，具体时间为：" + firstDayOfMonth);

        //修改时间为下个月的第一天
        LocalDate firstDayOfNextMonth = now.with(TemporalAdjusters.firstDayOfNextMonth());
        System.out.println("将时间修改为下个月的第一天，具体时间为：" + firstDayOfNextMonth);

        //修改时间为下一年的第一天
        LocalDate firstDayOfNextYear = now.with(TemporalAdjusters.firstDayOfNextYear());
        System.out.println("将时间修改为下一年的第一天，具体时间为：" + firstDayOfNextYear);

        //修改时间为本月的最后一天
        LocalDate lastDayOfMonth = now.with(TemporalAdjusters.lastDayOfMonth());
        System.out.println("将时间修改为本月的最后一天，具体时间为：" + lastDayOfMonth);

        //修改时间为本年的最后一天
        LocalDate lastDayOfYear = now.with(TemporalAdjusters.lastDayOfYear());
        System.out.println("将时间修改为本年的最后一天，具体时间为：" + lastDayOfYear);

        //TemporalAdjuster是一个接口，with方法实际上传入的是这个接口的实现对象，TemporalAdjusters并不是TemporalAdjuster的实现类，
        //只不过TemporalAdjusters的静态方法实现了TemporalAdjuster，并且将实现类的对象返回了
    }

    /**
     * TemporalAdjusters.previous(DayOfWeek dayOfWeek)的使用
     * TemporalAdjusters.next(DayOfWeek dayOfWeek)的使用
     */
    @Test
    public void test02() {
        //封装日期时间对象为当前时间。
        LocalDate now = LocalDate.now();
        System.out.println("当前时间为：" + now);

        //将当前时间修改为下一个周日
        LocalDate nextSunday = now.with(TemporalAdjusters.next(DayOfWeek.SUNDAY));
        System.out.println("下一个周日的时间是：" + nextSunday);

        //将当前时间修改为上一个周三
        LocalDate lastWednesday = now.with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY));
        System.out.println("上一个周三的时间是：" + lastWednesday);
    }
}
